var Device = {
    modeLinkElement: null, //模式关联控件
    configMode: false, //要求进入配置模式
    currentMode: 1, //当前模式（0表示配置，1表示工作）
    needTransCode: true, //是否需要转码(比如短信内容)
    typeDesc: "CWT-4421", //设备类型(默认为4421)
    dumpData: new Map(), //刷新出的指令
    dumpDataRegexp: new RegExp("\\$([\\w\\d_]+) (.*)$"), //使用空格分隔指令和数据的正则表达式
    dumpDataRegSplitColon: new RegExp("\\$([\\w\\d_]+):(.*)$"), //使用冒号分隔指令和数据的正则表达式
    doItems: [], //输出口items
    usercmdItems: [], //用户指令items
    nodes: { //节点
        cs: {
            count: 5
        }, //cs号码
        //来电白名单
        ca: {
            count: 4,
        },
        di: {
            count: 4
        }, //输入
        do: {
            count: 2
        }, //输出
        ain: {
            count: 4
        }, //模拟量(4421=4路AD+1路电压)
        reg: {
            count: 32
                // count: 128
        }, //寄存器
        usercmd: {
            count: 45
        }, //自定义指令
        gprs: {
            count: 4
        }, //gprs服务器
        ntpServer: {
            count: 3
        }, //ntp对时服务器
        timer: {
            count: 32
        }, //定时器
        wifi: {
            count: 5
        }, //wifi
        voc: { //voc通道数量
            count: 3
        },
        // sl651节点映射
        sl651Node: {
            count: 52,
        },
    },
    //修改模式
    changeConfigMode: function() {
        Device.setConfigMode(!Device.configMode);
    },
    //设置是否进入配置模式
    setConfigMode: function(mode) {
        Device.configMode = mode;
        if (Device.modeLinkElement) {
            if (mode) {
                Device.modeLinkElement.addClass("configMode");
            } else {
                Device.modeLinkElement.removeClass("configMode");
            }
        }
    },
    //如果需要，将数据转为UCS2码
    transCode: function(data) {
        return this.needTransCode ? transcodeToUCS2(data) : data;
    },
    //转为显示字符
    transCodeToChar: function(data) {
        return this.needTransCode ? ucs2ToChar(data) : data;
    },
    //添加刷新出的数据
    addDumpData: function(data) {
        var datas = data.split("\r");
        var thisDumpData = new Map(); //这次的数据
        let matched = false; //匹配
        let kv = null; //取出的指令头和数据的数组
        //遍历所有指令
        for (var i = 0; i < datas.length; i++) {
            //如果匹配到是刷新指令
            if (this.dumpDataRegexp.test(datas[i])) {
                kv = this.dumpDataRegexp.exec(datas[i]); //取出头部和参数
            } else if (this.dumpDataRegSplitColon.test(datas[i])) {
                kv = this.dumpDataRegSplitColon.exec(datas[i]); //取出头部和参数
            }

            if (kv != null) {
                this.dumpData.set(kv[1], kv[2]); //存储   
                thisDumpData.set(kv[1], kv[2]);
            }
        }
        return thisDumpData;
    },
    //添加指令头和尾(%和\n)
    addCmdHE: function(txt) {
        if (txt[0] != "%") {
            txt = "%" + txt;
        }
        if (txt[txt.length - 1] != "\n") {
            txt += "\n";
        }
        return txt;
    },
    //获得i18n的数据
    getI18nData: function(key) {
        return eval("i18n.lan." + key);
    },
    //获得接口的数量
    getNodesCount: function(node) {
        var count = 0;
        if (eval("this.nodes." + node + ".count")) {
            count = eval("this.nodes." + node + ".count");
        }
        return count;
    },
    //根据dumpKey(刷新参数标识),dumpParamIndex(多个参数时的序号),transcode(是否需要转码)获得值
    getOneDumpValue: function(dumpKey, dumpParamIndex, transcode) {
        let value = "";
        //有这个标识的刷新数据
        if (this.dumpData.has(dumpKey)) {
            value = this.dumpData.get(dumpKey);
            //如果是多个值，根据序号取出
            if (defined(dumpParamIndex)) {
                dumpParamIndex = parseInt(dumpParamIndex);
                value = value.split(",");
                //如果没有这个序号的值则为空字符串
                value = value.length > dumpParamIndex ? value[dumpParamIndex] : "";
            }
            //如果值需要转码（ucs2转为char）
            if (defined(transcode)) {
                value = this.transCodeToChar(value);
            }
        }
        return value;
    },
    //根据数值获得列表(0,1,...n)
    //disableNum禁用项数值
    getNumberItems: function(n, disableNum) {
        let items = [];
        for (var i = 0; i < n; i++) {
            items.push({
                value: i,
                text: "" + i
            });
        }
        //如果有禁用项
        if (defined(disableNum)) {
            items.push({ value: disableNum, text: disableNum + ":disabled" });
        }
        return items;
    },
    //获得所有输出口数组
    getDoItems: function() {
        //Do数量和item数量不匹配时
        if (this.doItems.length != this.nodes.do.count + 1) {
            this.doItems = [];
            for (var i = 0; i < this.nodes.do.count; i++) {
                this.doItems.push(i + ": " + i18n.lan.Do.name + i);
            }
            this.doItems.push(this.nodes.do.count + ": " + i18n.lan.common.none);
        }
        return this.doItems;
    },
    //获得所有输出口数据(combobox使用)
    getDoItemsKV: function() {
        //Do数量和item数量不匹配时
        if (this.doItems.length != this.nodes.do.count + 1) {
            this.doItems = [];
            for (var i = 0; i < this.nodes.do.count; i++) {
                this.doItems.push({
                    value: i,
                    text: i + ": " + i18n.lan.Do.name + i
                });
            }
            this.doItems.push({
                value: 255,
                text: "255: " + i18n.lan.common.none
            });
        }
        return this.doItems;
    },
    //获得输出联动类型
    getDoInterlockTypes: function() {
        return i18n.lan.Do.interlockTypes;
    },
    //返回常态items
    getNormalStateItemsKV: function() {
        return i18n.lan.common.normalStateItems;
    },
    //获得输出联动类型（value,text对）
    getDoInterlockTypesKV: function() {
        return i18n.lan.Do.interlockTypesKV;
    },
    //返回GPRS传输类型TCP/UDP
    getTransTypeItemsKV: function() {
        return i18n.lan.PageGprs.transTypeItemsKV;
    },
    //传输协议
    getTransProtocolItemsKV: function() {
        return i18n.lan.PageGprs.transProtocolItemsKV;
    },
    //获得用户自定义指令items
    getUserCmdItems: function() {
        if (this.usercmdItems.length != this.nodes.usercmd.count + 1) {
            this.usercmdItems = [];
            for (var i = 0; i < this.nodes.usercmd.count; i++) {
                this.usercmdItems.push(i + ": " + i18n.lan.PageUserCmd.usercmd + i);
            }
            this.usercmdItems.push(this.nodes.usercmd.count + ": " + i18n.lan.common.none);
        }
        return this.usercmdItems;
    },
    //获得用户自定义指令items
    getUserCmdItemsKV: function() {
        if (this.usercmdItems.length != this.nodes.usercmd.count + 1) {
            this.usercmdItems = [];
            for (var i = 0; i < this.nodes.usercmd.count; i++) {
                this.usercmdItems.push({
                    value: i,
                    text: i + ": " + i18n.lan.PageUserCmd.usercmd + i
                });
            }
            this.usercmdItems.push({
                value: 255,
                text: "255: " + i18n.lan.common.none
            });
        }
        return this.usercmdItems;
    },
    //获得寄存器序号的items
    getRegIndexItems: function() {
        let items = [];
        for (let i = 0; i < Device.nodes.reg.count; i++) {
            items.push({
                value: i,
                text: i.toString()
            });
        }
        return items;
    },
    //获得时区items
    getTimezoneItems: function() {
        let items = [];
        for (let i = -12; i <= 12; i++) {
            items.push({
                value: i,
                text: i
            });
        }
        return items;
    },
    //获得定时器动作类型
    getTimerActionTypeItems: function() {
        let defaultItems = i18n.lan.PageTimer.actTypeItemsKV;
        let index = defaultItems.length - 1;
        let items = defaultItems.concat();
        for (let i = 0; i < this.nodes.do.count; i++) {
            items.push({
                value: ++index,
                text: index + ": " + i18n.lan.Do.name + i + i18n.lan.PageTimer.pulse
            });
        }
        items.push({
            value: ++index,
            text: index + ": " + i18n.lan.common.reserve
        });
        items.push({
            value: ++index,
            text: index + ": " + i18n.lan.common.reserve
        });
        for (let i = 0; i < this.nodes.usercmd.count; i++) {
            items.push({
                value: ++index,
                text: index + ": " + i18n.lan.PageUserCmd.usercmd + i
            });
        }
        return items;
    },
}